package ru.niir.goodfil.db.handlers;

import ru.niir.goodfil.db.PersonalPrice;
import ru.niir.goodfil.db.Client;
import ru.niir.goodfil.db.Good;
import ru.niir.goodfil.utils.validation.ValidationResult;
import ru.niir.goodfil.utils.validation.ValidationError;
import ru.niir.goodfil.utils.validation.ValidationProblem;
import ru.niir.goodfil.utils.filters.PersonalPricesFilter;
import ru.niir.goodfil.exceptions.WrongHandlerException;

import java.util.List;

/**
 * Обработчик персональных цен
 */
public class PersonalPriceHandler extends Handler
{
    /**
     * Конструктор
     * @param gf
     */
    public PersonalPriceHandler(Goodfil gf)
    {
        super(PersonalPrice.class, gf);
    }

    /**
     * Проверка персональных цен
     * 1. clientId установлен верно (FK)
     * 2. goodId установлен верно (FK)
     * 3. personalPrice > minPrice for good
     * 4. уникальность интервала дат для клиента м товара (частично FK)
     * @param o персональная цена
     * @return результат проверки
     */
    @Override
    public ValidationResult validate(Object o)
    {
        assert o != null;
        if (!(o instanceof PersonalPrice)) throw new WrongHandlerException(klass, o.getClass());

        PersonalPrice personalPrice = (PersonalPrice) o;
        ValidationResult result = ValidationResult.Ok(PersonalPrice.class);

        if (!exists(Client.class, personalPrice.getClientId()))
            result.addValidationError(new ValidationError("clientId", "Клиент", personalPrice.getClientId(), ValidationProblem.REFERENCE));

        Good good = (Good) get(Good.class, personalPrice.getGoodId());
        if (good == null)
            result.addValidationError(new ValidationError("goodId", "Товар", personalPrice.getGoodId(), ValidationProblem.REFERENCE));
        else if (good.getMinPrice() > personalPrice.getPrice())
            result.addValidationError(new ValidationError("price", "Цена", personalPrice.getPrice(), ValidationProblem.CUSTOM, "Персональная цена не может быть ниже минимальной цены на товар"));


        
        return result;
    }
}
